#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>


int main(int argc , char *argv[])
{
    char ip_server[16];

    printf("Ingrese IP del servidor: ");
    scanf("%s", ip_server);


    /* Descriptor para el socket */
    int socket_var;
    /*
    Componentes de struct sockaddr_in
    short int sin_family --> Familia de la dirección
    unsigned short int sin_port --> Puerto
    struct in_addr sin_addr --> Dirección de internet
    unsigned char sin_zero[8] --> Del mismo tamaño que struct sockaddr
    */
    struct sockaddr_in servidor;
    /* El tamaño del mensaje será de 1000. */
    char mensaje[1000] , mensaje_servidor[2000];

    /*
    Creación del socket
    AF_INET: dominio.
    SOCK_STREAM: Tipo de socket --> socket de flujo.
    0: Protocolo.
    */
    socket_var = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_var == -1)
    {
        printf("Error. No se pudo crear el socket.");
    }

    /* Se especifica la IP del servidor. */
    servidor.sin_addr.s_addr = inet_addr(ip_server);
    servidor.sin_family = AF_INET;
    /* Se especifica el puerto del servidor. */
    servidor.sin_port = htons( 8888 );

    /* Se intenta establecer la conexión con el servidor. */
    if (connect(socket_var , (struct sockaddr *)&servidor , sizeof(servidor)) < 0)
    {
        perror("Error. La conexión con el servidor falló");
        return 1;
    }

    puts("Conexión establecida!\n");
    puts("Bienvenido al Chatroom, puedes empezar a escribir en la sala!");

    /* Por ahora se mantiene la conexión mediante while(1).
    Después se puede cambiar por alguna bandera o mensaje clave
    escrito por el usuario, como por ejemplo, el comando "salir". */
    strcpy (mensaje, " ");
    
    while( strcmp(mensaje, "exit") != 0)
    {
        printf("Escribe un mensaje: ");
        fgets(mensaje, sizeof(mensaje),stdin);
        
        /* Se envía la información. */
        if( send(socket_var , mensaje , strlen(mensaje) , 0) < 0)
        {
            puts("Envío fallido");
            return 1;
        }

        /* Se recibe la réplica del mensaje desde el servidor. */
        if( recv(socket_var, mensaje_servidor , 2000 , 0) < 0)
        {
            puts("Recibo fallido.");
            break;
        }

    printf("Mensaje del servidor: %s\n", mensaje_servidor);
    mensaje_servidor[0]='\0'; 
    }
    /* Se cierra el descriptor del socket. */
    printf("Se finalizó la conexión.");
    close(socket_var);
    return 0;
}


